<?php
/**
 * huhaiqin,2025.2.5
 * 抢鲜版的所有控制都在这儿
 * 关于抢鲜版得到的东西 放在user_info['trial']下面
 * 'trial' => [
 *     'item_id' => 10001, // 当前所在关卡
 *     'unlock_time' => time()
 */
namespace Game\Controller;
use Think\Controller;
use Game\Controller\GameBaseController;

class TrialController extends GameBaseController{

    /**
     * huhaiqin,2025.2.5
     * 获取关卡地图配置
     * 请求参数
     * stage_id: int //关卡ID,
     * //返回参数
     * stage_config: {} //关卡配置
     * 
     */
    public function get_map_config_json(){
        $stage_id = I('stage_id');
        if(!$stage_id){
            _apiReturn(0, '关卡id不能为空');
            return;
        }
        $stage = D('GameMapConfig','Service')->get_map_config_json($stage_id);
        dump($stage);
    }

    /**
     * huhaiqin,2025.2.5
     * 开始游戏接口
     * //请求参数
     *   token: string //用户token,
     *  stage_id: int //关卡id
     *  //返回参数
     *  stage_id: int//当前所在关卡
     *   energy_recover_timestamp: long //体力完全恢复的时间点
     */
    public function game_start(){
        $stage_id = I('stage_id');
        if(!$stage_id){
            _apiReturn(0, '关卡id不能为空');
            return;
        }
        $stage = D('GameStage')->_get_stage_info($stage_id);
        if(!$stage){
            _apiReturn(0, '关卡不存在');
            return;
        }
        $res = D('GameUser', 'Service')->game_start($this->_uid, $stage_id);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'game_start', $stage_id);
        _apiReturn(1, $res['msg'], ['stage_id' => $stage_id, 'energy' => $res['data']['energy'], 'user_info' => $this->_get_full_user_info()]);
    }

    /**
     * huhaiqin,2025.2.5
     * 结束结算接口
     * //请求参数
     *   token: string //用户token,
     *   stage_id: int //关卡id
     *  result: string //是否过关 success fail
     *  distance: int //跑动距离
     *  //返回参数
     *   stage_id: int//当前所在关卡
     *   reward_item_list: [] //得到的物品列表
     *  backpack：{} //背包 key-道具ID value-道具数量 （可以全量，也可以只发数量发生改变的道具）
     */
    public function game_end(){
        $stage_id = I('stage_id');
        if(!$stage_id){
            _apiReturn(0, '关卡id不能为空');
            return;
        }
        // 验证是否虚假闯关
        // 可以加上时间戳验证
        // $sign = hash_hmac('sha256', $stage_id, C('VERIFY_SECRET_KEY'));
        // if($sign!= I('sign')){
        //     _apiReturn(0, '关卡id不合法');
        //     return;
        // }
        if(!I('result')){
            _apiReturn(0, '游戏结果不能为空');
            return; 
        }
        $result = I('result');
        $distance = I('distance') ? I('distance') : 0;
        $stage = D('GameStage')->_get_stage_info($stage_id);
        if(!$stage){
            _apiReturn(0, '关卡不存在');
            return;
        }
        $res = D('GameUser', 'Service')->trial_game_end($this->_uid, $stage_id, $result, $distance);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'game_end', ['stage_id' => $stage_id, 'result' => $result, 'distance' => $distance], $res['data']['reward_item_list']);
        _apiReturn(1, $res['msg'], ['stage_id' => $stage_id, 'reward_item_list' => $res['data']['reward_item_list'], 'user_info' => $this->_get_full_user_info() ]);
    }

    /**
     * 
     * du,2025.2.11
     * 增加玩家体力
     * //请求参数
     * quantity: int //体力数量
     */
    public function recover_energy(){
        $quantity = I('quantity');
        if(!$quantity){
            _apiReturn(0, '体力数量不能为空');
            return;
        }
        $res = D('GameUser', 'Service')->recover_energy($this->_uid, $quantity);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return; 
        }
        _write_user_log($this->_uid, 'recover_energy', $quantity);
        _apiReturn(1, '体力恢复成功', ['energy' => $res['data']['energy'], 'user_info' => $this->_get_full_user_info()]);
    }

    /**
     * du,2025.2.11
     * 领取抢鲜徽章
     * //请求参数
     *  //返回参数
     *  backpack：{} //背包 key-道具ID value-道具数量 （可以全量，也可以只发数量发生改变的道具）
     *  item_list
     */
    public function claim_trial_badge(){
        $user = D('GameUser')->_get_game_user_info($this->_uid, 'backpack, task');
        // 抢先徽章的item_id = 20001 已经有这个徽章了
        if($user['backpack']['20001']){
            _apiReturn(0, '抢鲜徽章已领取，请闹心等待《奔跑吧R星人》正式版上线，来兑换专属好礼！');
            return;
        }
        // 用任务状态=2来标记已经拿过奖励 task_id = 10001
        if($user['task']['10001']['status'] != 1){
            _apiReturn(0, '抢鲜徽章已领取，请闹心等待《奔跑吧R星人》正式版上线，来兑换专属好礼！');
            return;
        }
        // 以上两种方式用一种来判断就可以了
        $post['backpack'] = $user['backpack'];
        $post['backpack']['20001'] = 1;
        $post['task'] = $user['task'];
        $post['task']['10001']['status'] = 2;
        
        $post['id'] = $this->_uid;
        $res = D('GameUser')->_edit_game_user_info($post);
        if(!$res){
            _apiReturn(0, '抢鲜徽章领取失败');
            return; 
        }
        _apiReturn(1, '抢鲜徽章领取成功', ['item_list' => ['20001' => 1], 'user_info' => $this->_get_full_user_info() ]);
    }

    /**
     * du,2025.2.11
     * 重置当日任务
     * //请求参数
     *  //返回参数
     *  task_list: {} //任务列表 key-任务ID value-任务状态 （可以全量，也可以只发状态发生改变的任务）
     */
    public function reset_daily_task(){
        $res = D('GameUser','Service')->reset_daily_task($this->_uid);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'reset_daily_task');
        _apiReturn(1, '任务重置成功', ['user_info' => $this->_get_full_user_info()]);
    }

    /**
     * du,2025.2.11
     * 完成任务
     * //请求参数
     * task_id: int //任务id
     *  //返回参数
     * user_info
     */
    public function complete_task(){
        if(!I('task_id')){
            _apiReturn(0, '任务id不能为空');
            return;
      
        }
        $task_id = I('task_id');
        $progress = (int)I('progress');
        if(!$progress){
            _apiReturn(0, '任务进度不能为空');
            return; 
        }
        $task = C('TRIAL_TASK_LIST')[$task_id];
        if(!$task){
            _apiReturn(0, '任务不存在');
            return;
        }
        // 验证是否虚假完成
        // 可以加上时间戳验证
        // $sign = hash_hmac('sha256', $task_id, C('VERIFY_SECRET_KEY'));
        // if($sign!= I('sign')){
        //     _apiReturn(0, '任务id不合法');
        //     return;
        // }
        $res = D('GameUser','Service')->complete_task($this->_uid, $task_id, $progress); 
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'complete_task', $task_id);
        _apiReturn(1, '任务完成', ['task_info' => $res['data']['task_info'], 'user_info' => $this->_get_full_user_info()]);
    }

    /**
     * huhaiqin,2025.2.5
     * 领取任务奖励接口
     * //请求参数
     *   task_id: int //任务id
     *  //返回参数
     * reward_item_list: {} //奖励物品列表 key-道具ID value-道具数量 （可以全量，也可以只发数量发生改变的道具）
     * 
     */
    public function claim_task_reward(){
        $task_id = I('task_id');
        if(!$task_id){
            _apiReturn(0, '任务id不能为空');
            return;
        }
        $task = C('TRIAL_TASK_LIST')[$task_id];
        if(!$task){
            _apiReturn(0, '任务不存在');
            return;
        }
        $res = D('GameUser','Service')->claim_trial_task_reward($this->_uid, $task_id);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return; 
        }
        _write_user_log($this->_uid, 'claim_task_reward', $task_id, $res['data']['reward_item_list']);
        _apiReturn(1, '任务奖励领取成功', ['reward_item_list' => $res['data']['reward_item_list'], 'user_info' => $this->_get_full_user_info()]);
    }
    /**
     * du,2025.2.11
     * 完成活动任务
     * //请求参数
     * activity_id: int //活动id
     * progress: int //进度
     *  //返回参数
     * user_info
     *
     */
    public function complete_activity(){
        $activity_id = I('activity_id');
        if(!$activity_id){
            _apiReturn(0, '活动id不能为空');
            return; 
        } 
        $progress = (int)I('progress');
        if(!$progress){
            _apiReturn(0, '活动进度不能为空');
            return;
        }
        $activity = _get_activity_list()[$activity_id];
        if(!$activity){
            _apiReturn(0, '活动不存在');
            return;
        }
        $res = D('GameUser','Service')->complete_activity($this->_uid, $activity_id, $progress);
        if(!$res['status']){
            _apiReturn(0, $res['msg']); 
        }
        _write_user_log($this->_uid, 'complete_activity', $activity_id);
        _apiReturn(1, '活动完成', ['activity_info' => $res['data']['activity_info'],'user_info' => $this->_get_full_user_info()]);
    }

    /**
     * du,2025.2.11
     * 领取活动奖励
     * //请求参数
     * activity_id: int //活动id
     *  //返回参数
     * reward_item_list: {} //奖励物品列表 key-道具ID value-道具数量 （可以全量，也可以只发数量发生改变的道具）
     *
     */
    public function claim_activity_reward(){
        $activity_id = I('activity_id');
        if(!$activity_id){
            _apiReturn(0, '活动id不能为空');
            return;
        }
        $activity = _get_activity_list()[$activity_id];
        if(!$activity){
            _apiReturn(0, '活动不存在');
            return;
        }
        // 处理徽章兑换逻辑
        if($activity['type'] == 'exchange'){
            $res = D('GameUser','Service')->exchange_activity_reward($this->_uid, $activity_id);
        }
        // 处理普通领取类活动奖励
        else{
            $res = D('GameUser','Service')->claim_activity_reward($this->_uid, $activity_id);
        }
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'claim_activity_reward', $activity_id, $res['data']['reward_item_list']);
        _apiReturn(1, '活动奖励领取成功', ['reward_item_list' => $res['data']['reward_item_list'], 'user_info' => $this->_get_full_user_info()]);
    }

    /**
     * du,2025.2.11
     * 兑换徽章
     * //请求参数
     * activity_id: int //徽章id
     *  //返回参数
     * reward_item_list: {} //奖励物品列表 key-道具ID value-道具数量 （可以全量，也可以只发数量发生改变的道具）
     *
     */
    private function exchange_activity_reward(){
        $activity_id = I('activity_id');
        if(!$activity_id){
            _apiReturn(0, '活动id不能为空');
            return;
        }
        $activity = _get_activity_list()[$activity_id];
        if(!$activity || $activity['type'] != 'exchange'){
            _apiReturn(0, '活动不存在');
            return;
        }    
        $res = D('GameUser','Service')->exchange_activity_reward($this->_uid, $activity_id);
        if(!$res['status']){
            _apiReturn(0, $res['msg']);
            return;
        }
        _write_user_log($this->_uid, 'exchange_activity_reward', $activity_id, $res['data']['reward_item_list']);
        _apiReturn(1, '活动奖励兑换成功', ['reward_item_list' => $res['data']['reward_item_list'], 'user_info' => $this->_get_full_user_info()]);
    }
}